//package com.example.sxmall.service.impl;
//
//import com.example.sxmall.common.OrderStatusEnum;
//import com.example.sxmall.common.PayStatusEnum;
//import com.example.sxmall.common.ServiceResultEnum;
//import com.example.sxmall.common.SxMallException;
//import com.example.sxmall.dao.mapper.OrderItemMapper;
//import com.example.sxmall.dao.mapper.OrderMapper;
//import com.example.sxmall.dao.mapper.ShoesMapper;
//import com.example.sxmall.dao.pojo.Order;
//import com.example.sxmall.dao.pojo.OrderItem;
//import com.example.sxmall.dao.pojo.Shoes;
//import com.example.sxmall.util.BeanUtil;
//import com.example.sxmall.util.NumberUtil;
//import com.example.sxmall.util.PageQueryUtil;
//import com.example.sxmall.util.PageResult;
//import com.example.sxmall.vo.*;
//import org.apache.commons.lang3.StringUtils;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.transaction.annotation.Transactional;
//import org.springframework.util.CollectionUtils;
//
//import java.util.*;
//import java.util.function.Function;
//import java.util.stream.Collectors;
//
//import static java.util.stream.Collectors.groupingBy;
//
///**
// * Created with IntelliJ IDEA.
// *
// * @Author: 潘天宇
// * @Date: 2022/03/22/9:37
// * @Description:
// */
//public class OrderServiceImpl {
//    @Autowired
//    private OrderMapper orderMapper;
//    @Autowired
//    private OrderItemMapper orderItemMapper;
//    @Autowired
//    private ShoppingCartItemMapper shoppingCartItemMapper;
//    @Autowired
//    private ShoesMapper shoesMapper;
//    @Autowired
//    private UserCouponRecordMapper userCouponRecordMapper;
//    @Autowired
//    private CouponMapper couponMapper;
//    @Autowired
//    private SeckillMapper seckillMapper;
//    @Autowired
//    private SeckillSuccessMapper seckillSuccessMapper;
//    @Autowired
//    private TaskService taskService;
//
//    @Override
//    public PageResult getOdersPage(PageQueryUtil pageUtil) {
//        List<Order> orders = orderMapper.findOrderList(pageUtil);
//        int total = orderMapper.getTotalOrders(pageUtil);
//        PageResult pageResult = new PageResult(orders, total, pageUtil.getLimit(), pageUtil.getPage());
//        return pageResult;
//    }
//
//    @Override
//    @Transactional
//    public String updateOrderInfo(Order order) {
//        Order temp = orderMapper.selectByPrimaryKey(order.getOrderId());
//        // 不为空且orderStatus>=0且状态为出库之前可以修改部分信息
//        if (temp != null && temp.getOrderStatus() >= 0 && temp.getOrderStatus() < 3) {
//            temp.setTotalPrice(order.getTotalPrice());
//            temp.setUserAddress(order.getUserAddress());
//            temp.setUpdateTime(new Date());
//            if (orderMapper.updateByPrimaryKeySelective(temp) > 0) {
//                return ServiceResultEnum.SUCCESS.getResult();
//            }
//            return ServiceResultEnum.DB_ERROR.getResult();
//        }
//        return ServiceResultEnum.DATA_NOT_EXIST.getResult();
//    }
//
//    @Override
//    public boolean updateByPrimaryKeySelective(Order order) {
//        return orderMapper.updateByPrimaryKeySelective(order) > 0;
//    }
//
//    @Override
//    @Transactional
//    public String checkDone(Long[] ids) {
//        // 查询所有的订单 判断状态 修改状态和更新时间
//        List<Order> orders = orderMapper.selectByPrimaryKeys(Arrays.asList(ids));
//        String errorOrderNos = "";
//        if (!CollectionUtils.isEmpty(orders)) {
//            for (Order order : orders) {
//                if (order.getIsDeleted() == 1) {
//                    errorOrderNos += order.getOrderNo() + " ";
//                    continue;
//                }
//                if (order.getOrderStatus() != 1) {
//                    errorOrderNos += order.getOrderNo() + " ";
//                }
//            }
//            if (StringUtils.isEmpty(errorOrderNos)) {
//                // 订单状态正常 可以执行配货完成操作 修改订单状态和更新时间
//                if (orderMapper.checkDone(Arrays.asList(ids)) > 0) {
//                    return ServiceResultEnum.SUCCESS.getResult();
//                } else {
//                    return ServiceResultEnum.DB_ERROR.getResult();
//                }
//            } else {
//                // 订单此时不可执行出库操作
//                if (errorOrderNos.length() > 0 && errorOrderNos.length() < 100) {
//                    return errorOrderNos + "订单的状态不是支付成功无法执行出库操作";
//                } else {
//                    return "你选择了太多状态不是支付成功的订单，无法执行配货完成操作";
//                }
//            }
//        }
//        // 未查询到数据 返回错误提示
//        return ServiceResultEnum.DATA_NOT_EXIST.getResult();
//    }
//
//    @Override
//    @Transactional
//    public String checkOut(Long[] ids) {
//        // 查询所有的订单 判断状态 修改状态和更新时间
//        List<Order> orders = orderMapper.selectByPrimaryKeys(Arrays.asList(ids));
//        String errorOrderNos = "";
//        if (!CollectionUtils.isEmpty(orders)) {
//            for (Order order : orders) {
//                if (order.getIsDeleted() == 1) {
//                    errorOrderNos += order.getOrderNo() + " ";
//                    continue;
//                }
//                if (order.getOrderStatus() != 1 && order.getOrderStatus() != 2) {
//                    errorOrderNos += order.getOrderNo() + " ";
//                }
//            }
//            if (StringUtils.isEmpty(errorOrderNos)) {
//                // 订单状态正常 可以执行出库操作 修改订单状态和更新时间
//                if (orderMapper.checkOut(Arrays.asList(ids)) > 0) {
//                    return ServiceResultEnum.SUCCESS.getResult();
//                } else {
//                    return ServiceResultEnum.DB_ERROR.getResult();
//                }
//            } else {
//                // 订单此时不可执行出库操作
//                if (errorOrderNos.length() > 0 && errorOrderNos.length() < 100) {
//                    return errorOrderNos + "订单的状态不是支付成功或配货完成无法执行出库操作";
//                } else {
//                    return "你选择了太多状态不是支付成功或配货完成的订单，无法执行出库操作";
//                }
//            }
//        }
//        // 未查询到数据 返回错误提示
//        return ServiceResultEnum.DATA_NOT_EXIST.getResult();
//    }
//
//    @Override
//    @Transactional
//    public String closeOrder(Long[] ids) {
//        // 查询所有的订单 判断状态 修改状态和更新时间
//        List<Order> orders = orderMapper.selectByPrimaryKeys(Arrays.asList(ids));
//        String errorOrderNos = "";
//        if (!CollectionUtils.isEmpty(orders)) {
//            for (Order order : orders) {
//                // isDeleted=1 一定为已关闭订单
//                if (order.getIsDeleted() == 1) {
//                    errorOrderNos += order.getOrderNo() + " ";
//                    continue;
//                }
//                // 已关闭或者已完成无法关闭订单
//                if (order.getOrderStatus() == 4 || order.getOrderStatus() < 0) {
//                    errorOrderNos += order.getOrderNo() + " ";
//                }
//            }
//            if (StringUtils.isEmpty(errorOrderNos)) {
//                // 订单状态正常 可以执行关闭操作 修改订单状态和更新时间
//                if (orderMapper.closeOrder(Arrays.asList(ids), OrderStatusEnum.ORDER_CLOSED_BY_JUDGE.getOrderStatus()) > 0) {
//                    return ServiceResultEnum.SUCCESS.getResult();
//                } else {
//                    return ServiceResultEnum.DB_ERROR.getResult();
//                }
//            } else {
//                // 订单此时不可执行关闭操作
//                if (errorOrderNos.length() > 0 && errorOrderNos.length() < 100) {
//                    return errorOrderNos + "订单不能执行关闭操作";
//                } else {
//                    return "你选择的订单不能执行关闭操作";
//                }
//            }
//        }
//        // 未查询到数据 返回错误提示
//        return ServiceResultEnum.DATA_NOT_EXIST.getResult();
//    }
//
//    @Override
//    @Transactional(rollbackFor = Exception.class)
//    public String saveOrder(UserVo user, Long couponUserId, List<ShoppingCartItemVO> myShoppingCartItems) {
//        List<Long> itemIdList = myShoppingCartItems.stream().map(ShoppingCartItemVO::getCartItemId).collect(Collectors.toList());
//        List<Long> goodsIds = myShoppingCartItems.stream().map(ShoppingCartItemVO::getGoodsId).collect(Collectors.toList());
//        List<Shoes> shoes = shoesMapper.selectByPrimaryKeys(goodsIds);
//        // 检查是否包含已下架商品
//        List<Shoes> goodsListNotSelling = shoes.stream()
//                .filter(shoesTemp -> shoesTemp.getGoodsSellStatus() != Constants.SELL_STATUS_UP)
//                .collect(Collectors.toList());
//        if (!CollectionUtils.isEmpty(goodsListNotSelling)) {
//            // goodsListNotSelling 对象非空则表示有下架商品
//            SxMallException.fail(goodsListNotSelling.get(0).getGoodsName() + "已下架，无法生成订单");
//        }
//        Map<Long, Shoes> shoesMap = shoes.stream().collect(Collectors.toMap(Shoes::getGoodsId, Function.identity(), (entity1, entity2) -> entity1));
//        // 判断商品库存
//        for (ShoppingCartItemVO shoppingCartItemVO : myShoppingCartItems) {
//            // 查出的商品中不存在购物车中的这条关联商品数据，直接返回错误提醒
//            if (!shoesMap.containsKey(shoppingCartItemVO.getGoodsId())) {
//                SxMallException.fail(ServiceResultEnum.SHOPPING_ITEM_ERROR.getResult());
//            }
//            // 存在数量大于库存的情况，直接返回错误提醒
//            if (shoppingCartItemVO.getGoodsCount() > shoesMap.get(shoppingCartItemVO.getGoodsId()).getStockNum()) {
//                SxMallException.fail(ServiceResultEnum.SHOPPING_ITEM_COUNT_ERROR.getResult());
//            }
//        }
//        if (CollectionUtils.isEmpty(itemIdList) || CollectionUtils.isEmpty(goodsIds) || CollectionUtils.isEmpty(shoes)) {
//            SxMallException.fail(ServiceResultEnum.ORDER_GENERATE_ERROR.getResult());
//        }
//        if (shoppingCartItemMapper.deleteBatch(itemIdList) <= 0) {
//            SxMallException.fail(ServiceResultEnum.DB_ERROR.getResult());
//        }
//        List<StockNumDTO> stockNumDTOS = BeanUtil.copyList(myShoppingCartItems, StockNumDTO.class);
//        int updateStockNumResult = shoesMapper.updateStockNum(stockNumDTOS);
//        if (updateStockNumResult < 1) {
//            SxMallException.fail(ServiceResultEnum.SHOPPING_ITEM_COUNT_ERROR.getResult());
//        }
//        // 生成订单号
//        String orderNo = NumberUtil.genOrderNo();
//        int priceTotal = 0;
//        // 保存订单
//        Order order = new Order();
//        order.setOrderNo(orderNo);
//        order.setUserId(user.getUserId());
//        order.setUserAddress(user.getAddress());
//        // 总价
//        for (ShoppingCartItemVO shoppingCartItemVO : myShoppingCartItems) {
//            priceTotal += shoppingCartItemVO.getGoodsCount() * shoppingCartItemVO.getSellingPrice();
//        }
//        // 如果使用了优惠卷
//        if (couponUserId != null) {
//            UserCouponRecord userCouponRecord = userCouponRecordMapper.selectByPrimaryKey(couponUserId);
//            Coupon coupon = couponMapper.selectByPrimaryKey(userCouponRecord.getCouponId());
//            priceTotal -= coupon.getDiscount();
//        }
//        if (priceTotal < 1) {
//            SxMallException.fail(ServiceResultEnum.ORDER_PRICE_ERROR.getResult());
//        }
//        order.setTotalPrice(priceTotal);
//        String extraInfo = "newbeemall-plus支付宝沙箱支付";
//        order.setExtraInfo(extraInfo);
//        // 生成订单项并保存订单项纪录
//        if (orderMapper.insertSelective(order) <= 0) {
//            SxMallException.fail(ServiceResultEnum.DB_ERROR.getResult());
//        }
//        // 如果使用了优惠卷，则更新优惠卷状态
//        if (couponUserId != null) {
//            UserCouponRecord couponUser = new UserCouponRecord();
//            couponUser.setCouponUserId(couponUserId);
//            couponUser.setOrderId(order.getOrderId());
//            couponUser.setUseStatus((byte) 1);
//            couponUser.setUsedTime(new Date());
//            couponUser.setUpdateTime(new Date());
//            userCouponRecordMapper.updateByPrimaryKeySelective(couponUser);
//        }
//        // 生成所有的订单项快照，并保存至数据库
//        List<OrderItem> orderItems = new ArrayList<>();
//        for (ShoppingCartItemVO shoppingCartItemVO : myShoppingCartItems) {
//            OrderItem orderItem = new OrderItem();
//            // 使用BeanUtil工具类将shoppingCartItemVO中的属性复制到orderItem对象中
//            BeanUtil.copyProperties(shoppingCartItemVO, orderItem);
//            // OrderMapper文件insert()方法中使用了useGeneratedKeys因此orderId可以获取到
//            orderItem.setOrderId(order.getOrderId());
//            orderItems.add(orderItem);
//        }
//        // 保存至数据库
//        if (orderItemMapper.insertBatch(orderItems) <= 0) {
//            SxMallException.fail(ServiceResultEnum.DB_ERROR.getResult());
//        }
//        // 订单支付超期任务，超过300秒自动取消订单
//        taskService.addTask(new OrderUnPaidTask(order.getOrderId(), ProjectConfig.getOrderUnpaidOverTime() * 1000));
//        // 所有操作成功后，将订单号返回，以供Controller方法跳转到订单详情
//        return orderNo;
//    }
//
//    @Override
//    public String seckillSaveOrder(Long seckillSuccessId, Long userId) {
//        SeckillSuccess seckillSuccess = seckillSuccessMapper.selectByPrimaryKey(seckillSuccessId);
//        if (!seckillSuccess.getUserId().equals(userId)) {
//            throw new SxMallException("当前登陆用户与抢购秒杀商品的用户不匹配");
//        }
//        Long seckillId = seckillSuccess.getSeckillId();
//        Seckill seckill = seckillMapper.selectByPrimaryKey(seckillId);
//        Long goodsId = seckill.getGoodsId();
//        Shoes shoes = shoesMapper.selectByPrimaryKey(goodsId);
//        // 生成订单号
//        String orderNo = NumberUtil.genOrderNo();
//        // 保存订单
//        Order order = new Order();
//        order.setOrderNo(orderNo);
//        order.setTotalPrice(seckill.getSeckillPrice());
//        order.setUserId(userId);
//        order.setUserAddress("秒杀测试地址");
//        order.setOrderStatus((byte) OrderStatusEnum.ORDER_PAID.getOrderStatus());
//        order.setPayStatus((byte) PayStatusEnum.PAY_SUCCESS.getPayStatus());
//        order.setPayType((byte) PayTypeEnum.WEIXIN_PAY.getPayType());
//        order.setPayTime(new Date());
//        String extraInfo = "";
//        order.setExtraInfo(extraInfo);
//        if (orderMapper.insertSelective(order) <= 0) {
//            throw new SxMallException("生成订单内部异常");
//        }
//        // 保存订单商品项
//        OrderItem orderItem = new OrderItem();
//        Long orderId = order.getOrderId();
//        orderItem.setOrderId(orderId);
//        orderItem.setSeckillId(seckillId);
//        orderItem.setGoodsId(shoes.getGoodsId());
//        orderItem.setGoodsCoverImg(shoes.getGoodsCoverImg());
//        orderItem.setGoodsName(shoes.getGoodsName());
//        orderItem.setGoodsCount(1);
//        orderItem.setSellingPrice(seckill.getSeckillPrice());
//        if (orderItemMapper.insert(orderItem) <= 0) {
//            throw new SxMallException("生成订单内部异常");
//        }
//        // 订单支付超期任务
//        taskService.addTask(new OrderUnPaidTask(order.getOrderId(), 30 * 1000));
//        return orderNo;
//    }
//
//    @Override
//    public OrderDetailVO getOrderDetailByOrderNo(String orderNo, Long userId) {
//        Order order = orderMapper.selectByOrderNo(orderNo);
//        if (order == null) {
//            return null;
//        }
//        // 验证是否是当前userId下的订单，否则报错
//        if (!userId.equals(order.getUserId())) {
//            SxMallException.fail(ServiceResultEnum.NO_PERMISSION_ERROR.getResult());
//        }
//        List<OrderItem> orderItems = orderItemMapper.selectByOrderId(order.getOrderId());
//        // 获取订单项数据
//        if (CollectionUtils.isEmpty(orderItems)) {
//            return null;
//        }
//        List<OrderItemVO> OrderItemVOS = BeanUtil.copyList(orderItems, OrderItemVO.class);
//        OrderDetailVO orderDetailVO = new OrderDetailVO();
//        BeanUtil.copyProperties(order, orderDetailVO);
//        orderDetailVO.setOrderStatusString(OrderStatusEnum.getOrderStatusEnumByStatus(orderDetailVO.getOrderStatus()).getName());
//        orderDetailVO.setPayTypeString(PayTypeEnum.getPayTypeEnumByType(orderDetailVO.getPayType()).getName());
//        orderDetailVO.setOrderItemVOS(OrderItemVOS);
//        UserCouponRecord userCouponRecord = userCouponRecordMapper.getUserCouponByOrderId(order.getOrderId());
//        if (userCouponRecord != null) {
//            Coupon coupon = couponMapper.selectByPrimaryKey(userCouponRecord.getCouponId());
//            orderDetailVO.setDiscount(coupon.getDiscount());
//        }
//        return orderDetailVO;
//    }
//
//    @Override
//    public Order getOrderByOrderNo(String orderNo) {
//        Order order = orderMapper.selectByOrderNo(orderNo);
//        return order;
//    }
//
//    @Override
//    public PageResult getMyOrders(PageQueryUtil pageUtil) {
//        int total = orderMapper.getTotalOrders(pageUtil);
//        List<Order> orders = orderMapper.findOrderList(pageUtil);
//        List<OrderListVO> orderListVOS = new ArrayList<>();
//        if (total > 0) {
//            // 数据转换 将实体类转成vo
//            orderListVOS = BeanUtil.copyList(orders, OrderListVO.class);
//            // 设置订单状态中文显示值
//            for (OrderListVO orderListVO : orderListVOS) {
//                orderListVO.setOrderStatusString(OrderStatusEnum.getOrderStatusEnumByStatus(orderListVO.getOrderStatus()).getName());
//            }
//            List<Long> orderIds = orders.stream().map(Order::getOrderId).collect(Collectors.toList());
//            if (!CollectionUtils.isEmpty(orderIds)) {
//                List<OrderItem> orderItems = orderItemMapper.selectByOrderIds(orderIds);
//                Map<Long, List<OrderItem>> itemByOrderIdMap = orderItems.stream().collect(groupingBy(OrderItem::getOrderId));
//                for (OrderListVO orderListVO : orderListVOS) {
//                    // 封装每个订单列表对象的订单项数据
//                    if (itemByOrderIdMap.containsKey(orderListVO.getOrderId())) {
//                        List<OrderItem> orderItemListTemp = itemByOrderIdMap.get(orderListVO.getOrderId());
//                        // 将OrderItem对象列表转换成OrderItemVO对象列表
//                        List<OrderItemVO> OrderItemVOS = BeanUtil.copyList(orderItemListTemp, OrderItemVO.class);
//                        orderListVO.setOrderItemVOS(OrderItemVOS);
//                    }
//                }
//            }
//        }
//        PageResult pageResult = new PageResult(orderListVOS, total, pageUtil.getLimit(), pageUtil.getPage());
//        return pageResult;
//    }
//
//    @Override
//    public String cancelOrder(String orderNo, Long userId) {
//        Order order = orderMapper.selectByOrderNo(orderNo);
//        if (order != null) {
//            // 验证是否是当前userId下的订单，否则报错
//            if (!userId.equals(order.getUserId())) {
//                SxMallException.fail(ServiceResultEnum.NO_PERMISSION_ERROR.getResult());
//            }
//            // 订单状态判断
//            if (order.getOrderStatus().intValue() == OrderStatusEnum.ORDER_SUCCESS.getOrderStatus()
//                    || order.getOrderStatus().intValue() == OrderStatusEnum.ORDER_CLOSED_BY_MALLUSER.getOrderStatus()
//                    || order.getOrderStatus().intValue() == OrderStatusEnum.ORDER_CLOSED_BY_EXPIRED.getOrderStatus()
//                    || order.getOrderStatus().intValue() == OrderStatusEnum.ORDER_CLOSED_BY_JUDGE.getOrderStatus()) {
//                return ServiceResultEnum.ORDER_STATUS_ERROR.getResult();
//            }
//            if (orderMapper.closeOrder(Collections.singletonList(order.getOrderId()), OrderStatusEnum.ORDER_CLOSED_BY_MALLUSER.getOrderStatus()) > 0) {
//                return ServiceResultEnum.SUCCESS.getResult();
//            } else {
//                return ServiceResultEnum.DB_ERROR.getResult();
//            }
//        }
//        return ServiceResultEnum.ORDER_NOT_EXIST_ERROR.getResult();
//    }
//
//    @Override
//    public String finishOrder(String orderNo, Long userId) {
//        Order order = orderMapper.selectByOrderNo(orderNo);
//        if (order != null) {
//            // 验证是否是当前userId下的订单，否则报错
//            if (!userId.equals(order.getUserId())) {
//                return ServiceResultEnum.NO_PERMISSION_ERROR.getResult();
//            }
//            // 订单状态判断 非出库状态下不进行修改操作
//            if (order.getOrderStatus().intValue() != OrderStatusEnum.ORDER_EXPRESS.getOrderStatus()) {
//                return ServiceResultEnum.ORDER_STATUS_ERROR.getResult();
//            }
//            order.setOrderStatus((byte) OrderStatusEnum.ORDER_SUCCESS.getOrderStatus());
//            order.setUpdateTime(new Date());
//            if (orderMapper.updateByPrimaryKeySelective(order) > 0) {
//                return ServiceResultEnum.SUCCESS.getResult();
//            } else {
//                return ServiceResultEnum.DB_ERROR.getResult();
//            }
//        }
//        return ServiceResultEnum.ORDER_NOT_EXIST_ERROR.getResult();
//    }
//
//    @Override
//    public String paySuccess(String orderNo, int payType) {
//        Order order = orderMapper.selectByOrderNo(orderNo);
//        if (order == null) {
//            return ServiceResultEnum.ORDER_NOT_EXIST_ERROR.getResult();
//        }
//        // 订单状态判断 非待支付状态下不进行修改操作
//        if (order.getOrderStatus().intValue() != OrderStatusEnum.ORDER_PRE_PAY.getOrderStatus()) {
//            return ServiceResultEnum.ORDER_STATUS_ERROR.getResult();
//        }
//        order.setOrderStatus((byte) OrderStatusEnum.ORDER_PAID.getOrderStatus());
//        order.setPayType((byte) payType);
//        order.setPayStatus((byte) PayStatusEnum.PAY_SUCCESS.getPayStatus());
//        order.setPayTime(new Date());
//        order.setUpdateTime(new Date());
//        if (orderMapper.updateByPrimaryKeySelective(order) <= 0) {
//            return ServiceResultEnum.DB_ERROR.getResult();
//        }
//        taskService.removeTask(new OrderUnPaidTask(order.getOrderId()));
//        return ServiceResultEnum.SUCCESS.getResult();
//    }
//
//    @Override
//    public List<OrderItemVO> getOrderItems(Long id) {
//        Order order = orderMapper.selectByPrimaryKey(id);
//        if (order != null) {
//            List<OrderItem> orderItems = orderItemMapper.selectByOrderId(order.getOrderId());
//            // 获取订单项数据
//            if (!CollectionUtils.isEmpty(orderItems)) {
//                List<OrderItemVO> OrderItemVOS = BeanUtil.copyList(orderItems, OrderItemVO.class);
//                return OrderItemVOS;
//            }
//        }
//        return null;
//    }
//}
